/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: EntityVersion.java 13 2012-07-30 09:29:31Z zhuxiaopeng $
 * $Revision: 13 $
 * $Date: 2012-07-30 17:29:31 +0800 (一, 2012-07-30) $
 * $Author: zhuxiaopeng $
 */
package zhu.framework.entity;

import java.io.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 13 $ - $Date: 2012-07-30 17:29:31 +0800 (一, 2012-07-30) $
 */
public final class EntityVersion implements Serializable {

	/**
	 * <h3>スレッドセーフ性</h3>
	 * <p>
	 * この変数は<code>this</code>によってGuardされる。 この変数は<code>final</code>
	 * であり、参照先がスレッドセーフであるため、スレッドセーフ性を破ることはない。
	 * この変数の参照先はスレッドセーフ<strong>ではない</strong>。
	 * </p>
	 */
	private static final long serialVersionUID = 1L;

	private EntityVersion(final long entityVersion) {
		this.entityVersion = entityVersion;
	}

	private static class EntityVersionCache {
		private EntityVersionCache() {
		}

		final static EntityVersion[] cache = new EntityVersion[10];

		static {
			for (int i = 0; i < cache.length; i++) {
				cache[i] = new EntityVersion(i + 1);
			}
		}
	}

	public static EntityVersion valueOf(final long idValue) {
		if (0 < idValue && idValue <= 10) {
			return EntityVersionCache.cache[(int) idValue - 1];
		}
		return new EntityVersion(idValue);
	}

	@Override
	public boolean equals(final Object obj) {
		if (obj == null) {
			return false;
		}
		if (obj instanceof EntityVersion == false) {
			return false;
		}
		return getEntityVersion() == ((EntityVersion) obj).getEntityVersion();
	}

	@Override
	public int hashCode() {
		return Long.valueOf(getEntityVersion()).hashCode();
	}

	private long getEntityVersion() {
		return entityVersion;
	}

	private final long entityVersion;
}
